// Go作者版权所有。版权所有。
// 此源代码的使用受BSD样式的约束
// 可以在许可证文件中找到的许可证。

package objabi

import "strings"

// PathToPrefix将原始字符串转换为将在
// 符号表。所有控制字符，空格“%”和“”，以及
// 非7位干净字节转换为%xx。周期只需要在中转义
// 这条路的最后一段，如果我们不把它当作一条路，它会让用户更快乐
// 尽量少。
func PathToPrefix(s string) string {
	slash := strings.LastIndex(s, "/")
	// 检查是否有需要逃逸的字符
	n := 0
	for r := 0; r < len(s); r++ {
		if c := s[r]; c <= ' ' || (c == '.' && r > slash) || c == '%' || c == '"' || c >= 0x7F {
			n++
		}
	}

	// 快速退出
	if n == 0 {
		return s
	}

	// 逃跑
	const hex = "0123456789abcdef"
	p := make([]byte, 0, len(s)+2*n)
	for r := 0; r < len(s); r++ {
		if c := s[r]; c <= ' ' || (c == '.' && r > slash) || c == '%' || c == '"' || c >= 0x7F {
			p = append(p, '%', hex[c>>4], hex[c&0xF])
		} else {
			p = append(p, c)
		}
	}

	return string(p)
}

// IsRuntimePackagePath检查“pkgpath”，如果为TRUE，则返回TRUE
// 属于“与运行时相关”包的集合，包括
// “运行时”本身、“反射”、“系统调用”和
// “运行时/内部/*”包。中的编译器和/或汇编程序
// 有些案例需要了解他们何时在构建这样一个系统
// 软件包，例如在中启用ABI选择器等功能
// 汇编来源。
// None
// 与cmd/dist/build保持同步。
func IsRuntimePackagePath(pkgpath string) bool {
	rval := false
	switch pkgpath {
	case "runtime":
		rval = true
	case "reflect":
		rval = true
	case "syscall":
		rval = true
	case "internal/bytealg":
		rval = true
	default:
		rval = strings.HasPrefix(pkgpath, "runtime/internal")
	}
	return rval
}
